home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / t_os / tool / pcom / src / bitio.c next >
Encoding:
C/C++ Source or Header  |  1994-11-16  |  2.7 KB  |  142 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "pc_inc.h"
  4.  
  5.  
  6. /*
  7. BIT_write_*** : データの下位ビットをファイルの上位ビットに書き込む
  8. BIT_read_***  : ファイルの上位ビットからデータの下位ビットに読み込む
  9. */
  10.  
  11. BIT_FILE *BIT_open( char *pname, char *type )
  12. {
  13.     BIT_FILE *ret;
  14.  
  15.     if ( ( ret = (BIT_FILE *)malloc( sizeof(BIT_FILE) ) ) == NULL )
  16.         return ( NULL );
  17.     if ( ( ret->fp = fopen( pname, type ) ) == NULL )
  18.         {
  19.         free( ret );
  20.         return ( NULL );
  21.         }
  22.     ret->mask = 128;    /* write関数用 */
  23.     ret->bcnt = 8;        /* read関数用 */
  24.     ret->buf = 0;
  25.  
  26.     return ( ret );
  27. }
  28.  
  29. int BIT_close( BIT_FILE *bfp )
  30. {
  31.     if ( bfp->mask < 128 )
  32.         if ( fputc( bfp->buf, bfp->fp ) == EOF )
  33.             return (-1);
  34.     fclose( bfp->fp );
  35.     free( bfp );
  36. }
  37.  
  38. int BIT_read_bit( unsigned int *dest, BIT_FILE *bfp )
  39. {
  40.     /* buf が空だったら読み込み */
  41.     if ( bfp->bcnt == 8 )
  42.         if ( ( bfp->buf = fgetc( bfp->fp ) ) == EOF )
  43.             return (0);
  44.         else
  45.             bfp->bcnt = 0;
  46.     /* 1 bit 読み込む */
  47.     if ( bfp->buf & 0x80 )
  48.         *dest = 1;
  49.     else *dest = 0;
  50.     bfp->buf <<= 1;
  51.     bfp->bcnt++;
  52.  
  53.     return (1);
  54. }
  55.  
  56. int BIT_read_bits( unsigned int *dest, size_t nelen, BIT_FILE *bfp )
  57. {
  58.     size_t cnt;
  59.  
  60.     *dest = 0;
  61.     for( cnt=0; cnt<nelen; cnt++ )
  62.         {
  63.         /* buf が空だったら読み込み */
  64.         if ( bfp->bcnt == 8 )
  65.             if ( ( bfp->buf = fgetc( bfp->fp ) ) == EOF )
  66.                 return ( cnt );
  67.             else bfp->bcnt = 0;
  68.         /* 1 bit 読み込む */
  69.         *dest <<= 1;
  70.         if ( bfp->buf & 0x80 )
  71.             (*dest)++;
  72.         bfp->buf <<= 1;
  73.         bfp->bcnt++;
  74.         }
  75.  
  76.     return ( cnt );
  77. }
  78.  
  79. int BIT_read_bytes( void *dest, size_t s, size_t n, BIT_FILE *bfp )
  80. {
  81.     bfp->bcnt = 8;
  82.     return ( fread( dest, s, n, bfp->fp ) );
  83. }
  84.  
  85. int BIT_write_bit( unsigned int src, BIT_FILE *bfp )
  86. {
  87.     /* 1 bit 書き込む */
  88.     if ( src )
  89.         bfp->buf |= bfp->mask;
  90.     bfp->mask >>= 1;
  91.     /* buf が一杯だったら書き込み */
  92.     if ( bfp->mask == 0 )
  93.         if ( fputc( bfp->buf, bfp->fp ) == EOF )
  94.             return (0);
  95.         else
  96.             {
  97.             bfp->mask = 128;
  98.             bfp->buf = 0;
  99.             }
  100.  
  101.     return (1);
  102. }
  103.  
  104. int BIT_write_bits( unsigned int src, size_t nelen, BIT_FILE *bfp )
  105. {
  106.     size_t cnt;
  107.  
  108.     src <<= (32-nelen);
  109.     for( cnt=0; cnt<nelen; cnt++ )
  110.         {
  111.         /* 1 bit 書き込む */
  112.         if ( src & 0x80000000 )
  113.             bfp->buf |= bfp->mask;
  114.         bfp->mask >>= 1;
  115.         src <<= 1;
  116.  
  117.         /* buf が一杯だったら書き込み */
  118.         if ( bfp->mask == 0 )
  119.             if ( fputc( bfp->buf, bfp->fp ) == EOF )
  120.                 break;
  121.             else
  122.                 {
  123.                 bfp->mask = 128;
  124.                 bfp->buf = 0;
  125.                 }
  126.         }
  127.  
  128.     return ( cnt );
  129. }
  130.  
  131. int BIT_write_bytes( void *src, size_t s, size_t n, BIT_FILE *bfp )
  132. {
  133.     if ( bfp->mask < 128 )
  134.         {
  135.         if ( fputc( bfp->buf, bfp->fp ) == EOF )
  136.             return (0);
  137.         bfp->mask = 128;
  138.         bfp->buf = 0;
  139.         }
  140.     return ( fwrite( src, s, n, bfp->fp ) );
  141. }
  142.